#ifndef _QUEUE_H_
#define _QUEUE_H_

#include <stdbool.h>

#define MAXQUEUE 10

typedef int Item; // 这里假设int类型是你要存储的东西

typedef struct node
{
    Item item;         // 单项
    struct node *next; // 下一个Node指针
} Node;

typedef struct queue
{
    Node *front; // 队列的头指针
    Node *tail;  // 队列的尾指针
    int items;   // 队列中的数量
} Queue;

/**
 * @brief 初始化队列为空
 *
 * @param pq 插入队列指针
 * @return true
 * @return false
 */
void InitializeQueue(Queue *pq);

/**
 * @brief 确定队列为空
 *
 * @param pq 插入队列指针
 * @return true
 * @return false
 */
bool QueueIsEmpty(const Queue *pq);

/**
 * @brief 确定队列为满
 *
 * @param pq 插入队列指针
 * @return true
 * @return false
 */
bool QueueIsFull(const Queue *pq);

/**
 * @brief 得到队列的项数
 *
 * @param pq 插入队列指针
 * @return unsigned int 返回队列的项数
 */
unsigned int QueueItemCount(const Queue *pq);

/**
 * @brief 添加队列尾部添加项
 *
 * @param item
 * @param pq 插入队列指针
 * @return true
 * @return false
 */
bool AddItemFromTail(Item item, Queue *pq);

// Item DeleteItemFromTail(Queue * pq);

/**
 * @brief 从队列开头删除项
 *
 * @param pitem item指针,通常新建一个空指针传入,队列中待删除的项存储在pitem中指向的位置
 * @param pq 插入队列指针
 * @return true
 * @return false
 */
bool DeleteItemFromTail(Item *pitem, Queue *pq);

/**
 * @brief 清空队列
 *
 * @param pq
 * @return true
 * @return false
 */
bool EmptyQueue(Queue *pq);

/**
 * @brief 在队列中对每一个对象执行传入函数
 *
 * @param pqueue 队列
 * @param Function 传入的想要执行的函数指针
 */
void QueueTraverse(const Queue *pqueue, void (*Function)(Node *pnode));

#endif
